/**
 * @(#)TipoContenido 31/08/11
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n:31/08/11 - 08:03 PM PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>31/08/11 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.basico.mime;

import com.psiqueware.alheli.basico.BaseObjectInterface;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Equivalente al <code>Content Type</code> de la especificaci&oacute;n de <code>Mime</code>.
 * <p>
 * [<a href="http://www.ietf.org/rfc/rfc2045.txt?number=2045">RFC2045</a>,<a href="http://www.ietf.org/rfc/rfc2046.txt?number=2046">RFC2046</a>]
 * especifican los <code>Content Type</code>, <code>Content Subtypes</code>, <code>Character Sets</code>, <code>Access Types</code>
 * y las conversiones de los valores para correos electr&oacute;nicos <code>MIME</code> que son asignados por la <code>IANA</code>
 * </p>
 * <p> Los procedimientos para registrar tipos de medios pueden ser encontrados en <a href="http://www.ietf.org/rfc/rfc4288.txt?number=4288">[RFC4288]</a>,<a href="http://www.ietf.org/rfc/rfc4289.txt?number=4289">[RFC4289]</a>.
 * <p/>
 * </p>
 * <p>La siguiente es una lista de los <code>Content Type</code> y <code>Content Subtypes</code>:</p>
 * <p><a href="http://www.iana.org/assignments/media-types/application/">application</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/audio/">audio</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/examples/">example</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/image/">image</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/message/">message</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/model/">model</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/multipart/">multipart</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/text/">text</a></p>
 * <p><a href="http://www.iana.org/assignments/media-types/video/">video</a>
 * <p/>
 * <p/>
 * <br/>Paquete Original: com.psiqueware.alheli.basico.mime
 * <br/>Nombre  Original: TipoContenido
 * <br/>Oprima para ver : <a href="TipoContenido.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a>
 * @version Revision: 1.1 31/08/11 07:03 PM
 * @noinspection StaticVariableOfConcreteClass, StaticVariableNamingConvention, ClassWithoutNoArgConstructor, ClassWithoutLogger, ValueOfIncrementOrDecrementUsed, NonFinalStaticVariableUsedInClassInitialization, MethodReturnOfConcreteClass
 */
public enum TipoContenido implements BaseObjectInterface<TipoContenido>
{
    APPLICATION(1L, "TipoContenido.APPLICATION", "application"),
    AUDIO(2L, "TipoContenido.AUDIO", "audio"),
    CHEMICAL(3L, "TipoContenido.CHEMICAL", "chemical"),
    DRAWING(4L, "TipoContenido.DRAWING", "drawing"),
    EXAMPLE(5L, "TipoContenido.EXAMPLE", "example"),
    I_WORLD(6L, "TipoContenido.I_WORLD", "i-world"),
    IMAGE(7L, "TipoContenido.IMAGE", "image"),
    MESSAGE(8L, "TipoContenido.MESSAGE", "message"),
    MODEL(9L, "TipoContenido.MODEL", "model"),
    MULTIPART(10L, "TipoContenido.MULTIPART", "multipart"),
    MUSIC(11L, "TipoContenido.MUSIC", "music"),
    PALEOVU(12L, "TipoContenido.PALEOVU", "paleovu"),
    TEXT(13L, "TipoContenido.TEXT", "text"),
    VIDEO(14L, "TipoContenido.VIDEO", "video"),
    WINDOWS(15L, "TipoContenido.WINDOWS", "windows"),
    WWW(16L, "TipoContenido.WWW", "www"),
    X_CONFERENCE(17L, "TipoContenido.X_CONFERENCE", "x-conference"),
    X_MUSIC(18L, "TipoContenido.X_MUSIC", "x-music"),
    X_WORLD(19L, "TipoContenido.X_WORLD", "x-world"),
    XGL(20L, "TipoContenido.XGL", "xgl");


    /**
     * Nombre de este TipoContenido.
     */
    private final String m_nombre;

    /**
     * Identificador &uacute;nico de esta TipoContenido.
     * Se utiliza de tipo Long para poder portar esta clase facilmente a un cat&aacute;logo.
     */
    private final Long m_id;

    /**
     * <code>Content-Type</code> como esta expresadon en la especificaci&oacute;n.
     */
    private final String m_tipo;


    /**
     * Construye un TipoContenido a partir de un nombre y un id.
     * <p>Es una enumeraci&oacute;n por lo tanto el constructor es privado.</p>
     *
     * @param id     Identificador &uacute;nico de esta TipoContenido.
     *               Se utiliza de tipo Long para poder portar esta clase facilmente a un cat&aacute;logo.
     * @param nombre Nombre de este TipoContenido.
     * @param tipo   <code>Content-Type</code> como esta expresadon en la especificaci&oacute;n.
     */
    private TipoContenido(Long id, String nombre, String tipo)
    {
        m_nombre = nombre;
        this.m_id = id;
        m_tipo = tipo;
    }

    /**
     * Convierte este <code>TipoContenido</code> a su representaci&oacute;n textual.
     *
     * @noinspection DuplicateStringLiteralInspection, HardCodedStringLiteral
     */
    public String toString()
    {

        StringBuffer sb = new StringBuffer();
        sb.append("<Instance Class = '").append(this.getClass()).append("'>");
        sb.append("<id>").append(m_id).append("</id>");
        sb.append("<nombre>").append(m_nombre).append("</nombre>");
        sb.append("</Instance>");
        return sb.toString();
    }

    /**
     * Devuelve el identificador textual de este TipoContenido.
     *
     * @return String con el nombre.
     */
    public String getNombre()
    {
        return m_nombre;
    }


    /**
     * Devuelve el identificador &uacute;nico de este TipoContenido.
     *
     * @return Long con el id.
     */
    public Long getId()
    {
        return m_id;
    }

    /**
     * Devuelve el <code>Content-Type</code> como esta expresadon en la especificaci&oacute;n.
     *
     * @return valor de 'm_tipo'.
     */
    public String getTipo()
    {
        return m_tipo;
    }

    /**
     * Devuelve un <code>List</code> con los <code>TipoContenido</code> de esta enumeraci&oacute;n.
     */
    private static List<TipoContenido> m_objects = null;

    /**
     * Devuelve una lista con todos los <code>TipoContenido</code> de la enumeraci&oacute;n.
     *
     * @return nueva List de <code>TipoContenido</code>;
     *
     * @noinspection ReturnOfCollectionOrArrayField
     */
    public static List<TipoContenido> listTipoContenidoComun()
    {
        if (null == m_objects)
        {
            generaListTipoContenidoComun();
        }
        return m_objects;
    }

    /**
     * Genera una lista con todos los <code>TipoContenido</code> de la enumeraci&oacute;n.
     *
     * @return nueva List de <code>TipoContenido</code>;
     */
    private static synchronized List<TipoContenido> generaListTipoContenidoComun()
    {
        if (null == m_objects)
        {
            m_objects = new ArrayList<TipoContenido>();
            Collections.addAll(m_objects, values());
        }
        return m_objects;
    }


    /**
     * Devuelve el TipoContenido al que corresponde este id.
     *
     * @param id del TipoContenido buscado.
     *
     * @return <code>TipoContenido</code>.
     */
    public static TipoContenido desdeId(Long id)
    {
        TipoContenido salida = null;
        for (TipoContenido obj : listTipoContenidoComun())
        {
            if (obj.getId().equals(id))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

    /**
     * Devuelve el TipoContenido al que corresponde este nombre.
     *
     * @param nombre del TipoContenido buscado.
     *
     * @return <code>TipoContenido</code>.
     *
     * @noinspection CallToStringEquals
     */
    public static TipoContenido desdeNombre(String nombre)
    {
        TipoContenido salida = null;
        for (TipoContenido obj : listTipoContenidoComun())
        {
            if (obj.getNombre().equals(nombre))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

}
